C++复习 sizeof()

  1. sizeof()
    1. c++11
    2. 总结
  2. offsetof

sizeof()

  • sizeof 运算符返回一条表达式或一个类型名字所占的字节数。

    满足右结合律
    sizeof p = sizeof(p);

返回值:size_t类型的常量表达式

//使用方法
sizeof (type)
sizeof expr //返回表达式结果类型的大小,不实际计算运算对象的值
  • 不实际计算运算对象,即使对象是空指针也可以运行

c++11

  • 可以通过 作用域 符号来获取成员的大小
sizeof ClassName::ClassMember;//ClassName的ClassMember成员对应类型的大小

总结

  • 对char或者类型为char的表达式,结果为1
  • 对引用类型,结果为被引用对象所占空间的大小
  • 对指针类型,结果为指针本身所占空间的大小
  • 对解引用指针类型,结果为指向的对象所占空间的大小,指针不需要有效
  • 对数组,结果为数组所占空间的大小,等价于数组中所有元素所占空间之和。sizeof不把数组转换为指针进行处理
  • 对string和vector等,返回该类型固定部分的大小,不会计算对象中的元素占用了多少空间

offsetof

  • 这个宏会返回一个结构体成员相对于结构体开头的字节偏移量(经过结构对齐之后
    • type 结构体名称
    • 结构体成员名称
  • 这个宏非常有用,由于结构体对齐的问题,整个结构体的大小并不是所有成员大小之和,往往要比他们的和大,(当然我们也可以执行结构体按一个字节进行对其),所以利用这个宏可以很好计算出每个结构体成员相对于结构体开头偏移的字节数。
#include <stddef.h>
#include <stdio.h>

struct struct_test
{
    float fild1;
    double fild2;
    int fild3;
    short fild4;
    long long fild5;
};


int main(void)
{
    printf("struct_test size is %lu \nfild1 offset %lu\nfild2 offset %lu \nfild3 offset %lu \nfild4 offset %lu \nfild5 offset %lu\n",
                        sizeof(struct struct_test),
                        offsetof(struct struct_test,fild1),
                        offsetof(struct struct_test,fild2),
                        offsetof(struct struct_test,fild3),
                        offsetof(struct struct_test,fild4),
                        offsetof(struct struct_test,fild5));
    return 0;
}

/*
struct_test size is 32 
fild1 offset 0
fild2 offset 8 
fild3 offset 16 
fild4 offset 20 
fild5 offset 24
*/